闲来没事,简单分析分析,理解理解
分析exp
首先这个跟runc有关
RunC 是一个轻量级的工具,它是用来运行容器的,只用来做这一件事,并且这一件事要做好。我们可以认为它就是个命令行小工具,可以不用通过 docker 引擎,直接运行容器。
exp:
https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go
步骤1:首先替换了/bin/sh
为#!/proc/self/exe
,这样的话,当某个程序调用/bin/sh的时候,就会调用自身
1 | // First we overwrite /bin/sh with the /proc/self/exe interpreter path |
我们可以用ll看看,是不是指向ls
1 | root@b7652e3a006b:~# ll /proc/self/exe |
步骤2:寻找runc的pid
1 | // Loop through all processes to find one whose cmdline includes runcinit |
步骤3:往找到的runc的文件句柄写我们要执行的命令什么的
1 | // We will use the pid to get a file handle for runc on the host. |
找pid的目的是找到runc的路径,比如下面可以通过 /proc/pid/exe获得/bin/bash的软连接,只不过上面是获取runc的软连接
1 | root@b7652e3a006b:~# ps -aux | grep bash |
步骤4:当用户调用docker exec的时候,相当于runc 调用/bin/sh,而/bin/sh被我们改为#!/proc/self/exe,即runc运行自身,而runc自身也被我们修改了,所以相当于runc执行了我们的代码
Reference
https://thinkycx.me/posts/2019-05-23-CVE-2019-5736-docker-escape-recurrence.html
https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go